1. 初始化客户端
🤖 Assistant
Chroma 是一款轻量级、开源的向量数据库,专为 AI 应用设计,尤其适合个人开发者和小规模项目。以下是 Chroma 的核心功能和 具体应用场景的详细分类说明:
一、基础功能
| 功能 | 说明 |
|---|---|
| 向量存储与检索 | 存储高维向量(如文本/图像嵌入),支持相似性搜索(余弦/L2距离)。 |
| 多模态支持 | 可存储文本、图像、音频的嵌入向量(需配合多模态模型如 CLIP)。 |
| 元数据过滤 | 在搜索时通过附加字段(如作者、日期)过滤结果。 |
| 持久化存储 | 支持将数据保存到本地磁盘(PersistentClient)。 |
| LangChain 集成 | 直接兼容 LangChain 的 VectorStore 接口,简化 RAG 流程。 |
二、典型应用场景
1. 检索增强生成(RAG)
- 用途:为大模型(如 GPT-4)提供外部知识库,提升回答准确性。
- 示例步骤:
```python
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 加载文档并分块
loader = TextLoader("article.txt")
documents = loader.load_and_split()
# 生成嵌入并存储到 Chroma
db = Chroma.from_documents(documents, OpenAIEmbeddings())
# 检索相似片段输入 LLM
query = "What is the main topic?"
docs = db.similarity_search(query)
print(docs[0].page_content)
```
2. 语义搜索
- 用途:替代关键词搜索,实现“意图匹配”(如搜索类似“如何优化AI模型”的文档)。
- 示例:
```python
# 使用 Sentence-BERT 生成嵌入
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
# 查询扩展
results = db.query(
query_texts=["AI model optimization techniques"],
n_results=3,
where={"category": "machine_learning"} # 元数据过滤
)
```
3. 推荐系统
- 用途:基于用户历史行为或商品嵌入,推荐相似内容。
- 示例:
python # 用户偏好向量 vs 商品向量库 user_preference = model.encode("user likes sci-fi movies") movies = db.query(query_embeddings=[user_preference], n_results=5)
4. 去重与聚类
- 用途:快速识别重复或相似内容(如新闻去重、用户反馈归类)。
- 示例:
python # 查找相似度超过阈值的文档 duplicates = db.query( query_embeddings=[existing_doc_embedding], where={"score": {"$gt": 0.95}} # 高相似度过滤 )
5. 多模态搜索
- 用途:跨模态检索(如用文本搜图片,或反之)。
- 示例:
```python
# 使用 CLIP 模型生成多模态嵌入
image_embeddings = clip_model.encode_images([image1, image2])
text_embeddings = clip_model.encode_text(["a sunny beach"])
# 混合检索
results = db.query(query_embeddings=text_embeddings, n_results=2)
```
三、高级功能
1. 混合搜索(向量 + 关键词)
- 结合传统关键词搜索(BM25)和向量搜索,提升召回率。
- 工具扩展:通过
langchain.retrievers混合 Chroma 和 Elasticsearch。
2. 动态更新索引
- 支持增量插入和删除数据,适合实时应用:
```python
# 增量添加
db.add_documents([new_doc])
# 删除数据
db.delete(ids=["obsolete_id"])
```
3. 分布式扩展(实验性)
- 通过
Chroma HTTP Client连接远程服务,实现多节点部署(需自行搭建)。
四、限制与注意事项
- 数据规模:适合中小规模数据(单机内存限制,通常 ≤1M 向量)。
- 生产环境:若需高可用性,建议改用 Milvus 或 Pinecone。
- 嵌入模型:Chroma 不生成嵌入,需自行调用模型(如 OpenAI、Sentence-BERT)。
五、快速原型开发模板
import chromadb
from chromadb.utils import embedding_functions
# 1. 初始化客户端
client = chromadb.PersistentClient(path="./chroma_db")
# 2. 创建集合(使用默认嵌入模型)
sbert_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
collection = client.create_collection(
name="my_collection",
embedding_function=sbert_ef
)
# 3. 插入数据(自动生成嵌入)
collection.add(
documents=["doc1 text", "doc2 text"],
metadatas=[{"author": "Alice"}, {"author": "Bob"}],
ids=["id1", "id2"]
)
# 4. 搜索(按语义 + 元数据)
results = collection.query(
query_texts=["Find documents by Bob"],
where={"author": "Bob"}, # 元数据过滤
n_results=1
)
print(results["documents"])
总结
Chroma 最适合以下场景:
✅ 个人研究/实验
✅ RAG 快速验证
✅ 小规模语义搜索(<1M 数据)
✅ 需要简单集成的 LangChain 项目
如需处理更大规模数据或生产级需求,可逐步迁移到 Milvus/Pinecone。